package cn.csq.netty.nio;



import java.nio.IntBuffer;
public class UseBuffer {

    public static void main(String[] args) {
        //IntBuffer是具体的Buffer子类，通过调用IntBuffer.allocate(20)创建了一个intBuffer实例对象，
        // 并且分配了20×4字节的内存空间
        //int 是 4个字节的

        IntBuffer intBuffer = IntBuffer.allocate(20);


        System.out.println("after allocate ");

        System.out.println(intBuffer.position());

        System.out.println(intBuffer.limit());

        System.out.println(intBuffer.capacity());


        //BIO实例的创建写入、读取、重复读取、标记、重制

        //allocate 初始化创建  一个缓冲区在新建后处于写模式
        //put

        for (int i = 0; i < 5; i++) {
            intBuffer.put(i);
        }

        System.out.println("after put");
        System.out.println(intBuffer.position());
        System.out.println(intBuffer.limit());
        System.out.println(intBuffer.mark());
        System.out.println(intBuffer.capacity());

        //flip  模式翻转  写模式切换为读模式
        intBuffer.flip();
        System.out.println("after flip");
        System.out.println(intBuffer.position());
        System.out.println(intBuffer.limit());
        System.out.println(intBuffer.mark());
        System.out.println(intBuffer.capacity());

        // public final Buffer flip() {
        //        limit = position;
        //        position = 0;
        //        mark = -1;
        //        return this;
        //    }
        //在读取完成后，如何再一次将缓冲区切换成写模式呢？
        //答案是：可以调用Buffer.clear()清空或者Buffer.compact()压缩方法，它们可以将缓冲区转换为写模式

        //get 使用flip将写模式切换为读模式 就可以使用get方法读取数据了
        for (int i = 0; i < 3; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println(intBuffer.position());
        System.out.println(intBuffer.limit());
        System.out.println(intBuffer.mark());
        System.out.println(intBuffer.capacity());

        for (int i = 0; i < 2; i++) {
            int j = intBuffer.get();
            System.out.println("j = " + j);
        }
        System.out.println(intBuffer.position());
        System.out.println(intBuffer.limit());
        System.out.println(intBuffer.mark());
        System.out.println(intBuffer.capacity());
        //这里强调一下，在读完之后是否可以立即对缓冲区进行数据写入呢？答案是不能。现在还处于读模式，我们必须调用Buffer.clear()或Buffer.compact()方法，即清空或者压缩缓冲区，将缓冲区切换成写模式，让其重新可写。此外还有一个问题：缓冲区是不是可以重复读呢？答案是可以的，既可以通过倒带方法rewind()去完成，也可以通过mark()和reset()两个方法组合实现

        //rewind  读取完的数据可以调用rewind方法在读取一边，倒带
        intBuffer.rewind();
        for (int i = 0; i < 5; i++) {
            int i1 = intBuffer.get();
            System.out.println("i1 = " + i1);
        }

        for (int i = 0; i < 5; i++) {
            if (i ==2) {
                //临时保存 标记一下第三个位置
                intBuffer.mark();
            }
            int i1 = intBuffer.get();
            System.out.println("i1 = " + i1);
        }
        //mark reset
        //mark()和reset()两个方法是配套使用的：Buffer.mark()方法将当前position的值保存起来放在mark属性中，让mark属性记住这个临时位置；然后可以调用Buffer.reset()方法将mark的值恢复到position中。
        for (int i = 0; i < 5; i++) {
            if (i ==2) {
                //临时保存 标记一下第三个位置
                intBuffer.mark();
            }
            intBuffer.reset();
            int i1 = intBuffer.get();
            System.out.println("reset = " + i1);
        }

        //clear



    }

}
